/*
 * Licensed to the 南京汇海交通科技有限公司
 *
 * Copyright (c) 2025.
 * All rights reserved.
 *
 * 本软件属南京汇海交通科技有限公司所有，在未获得南京汇海交通科技有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.chframework.mybatis;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 任何数据访问对象都该继承此类
 *
 * @param <MAPPER> 映射xml文件的mapper接口类型
 * @param <DO>     声明数据对象的引用类型
 */
public abstract class CommonDAO<MAPPER extends BaseMapper<DO>, DO> extends ServiceImpl<MAPPER, DO> implements ICommonDAO<DO> {

    // region BaseMapper API

    /**
     * 插入一条数据对象
     *
     * @param entity 数据对象
     * @return 返回受影响行数
     */
    @Override
    public int insert(DO entity) {
        return super.baseMapper.insert(entity);
    }

    /**
     * 根据主键id删除一条数据
     *
     * @param id 主键，表数据的唯一标识
     * @return 返回受影响行数
     */
    @Override
    public int deleteById(Serializable id) {
        return super.baseMapper.deleteById(id);
    }

    /**
     * 根据多个表字段批量删除数据
     *
     * @param columnMap 多个表字段
     * @return 返回受影响行数
     */
    @Override
    public int deleteByMap(Map<String, Object> columnMap) {
        return super.baseMapper.deleteByMap(columnMap);
    }

    /**
     * 根据动态构建的where条件批量删除数据
     *
     * @param queryWrapper 动态构建where条件的对象
     * @return 返回受影响的行数
     */
    @Override
    public int delete(Wrapper<DO> queryWrapper) {
        return super.baseMapper.delete(queryWrapper);
    }

    /**
     * 根据主键id集合批量删除数据
     *
     * @param idList 主键id集合
     * @return 返回受影响行数
     */
    @Override
    public int deleteBatchIds(Collection<? extends Serializable> idList) {
        return super.baseMapper.deleteBatchIds(idList);
    }

    /**
     * 根据主键id更新一条数据库记录
     *
     * @param entity 数据对象
     * @return 返回受影响行数
     */
    @Override
    public int updateByPrimaryKey(DO entity) {
        return super.baseMapper.updateById(entity);
    }

    /**
     * 根据动态构建的where条件批量更新数据
     *
     * @param entity        数据对象
     * @param updateWrapper 动态构建where条件的对象
     * @return 返回受影响行数
     */
    @Override
    public int updateByWrapper(DO entity, Wrapper<DO> updateWrapper) {
        return super.baseMapper.update(entity, updateWrapper);
    }

    /**
     * 根据主键id查询一条数据库记录
     *
     * @param id 主键id
     * @return 返回一个数据对象
     */
    @Override
    public DO selectById(Serializable id) {
        return super.baseMapper.selectById(id);
    }

    /**
     * 根据主键id批量查询多条数据库记录
     *
     * @param idList 主键id集合
     * @return 返回数据对象集合
     */
    @Override
    public List<DO> selectBatchIds(Collection<? extends Serializable> idList) {
        return super.baseMapper.selectBatchIds(idList);
    }

    /**
     * 根据多个表字段批量查询多条数据库记录
     *
     * @param columnMap 多个表字段
     * @return 返回数据对象集合
     */
    @Override
    public List<DO> selectByMap(Map<String, Object> columnMap) {
        return super.baseMapper.selectByMap(columnMap);
    }

    /**
     * 根据动态构建的where条件查询一条数据库记录
     *
     * @param queryWrapper 动态构建where条件的对象
     * @return 返回一个数据对象
     */
    @Override
    public DO selectOne(Wrapper<DO> queryWrapper) {
        return super.baseMapper.selectOne(queryWrapper);
    }

    /**
     * 根据动态构建的where条件统计数据库记录的数量
     *
     * @param queryWrapper 动态构建where条件的对象
     * @return 返回满足条件的数据库记录数量
     */
    @Override
    public Long selectCount(Wrapper<DO> queryWrapper) {
        return super.baseMapper.selectCount(queryWrapper);
    }

    /**
     * 根据动态构建的where条件批量查询多条数据库记录
     *
     * @param queryWrapper 动态构建where条件的对象
     * @return 返回数据对象集合
     */
    @Override
    public List<DO> selectList(Wrapper<DO> queryWrapper) {
        return super.baseMapper.selectList(queryWrapper);
    }

    /**
     * 根据动态构建的where条件批量查询多条数据库记录
     *
     * @param queryWrapper 动态构建where条件的对象
     * @return 以Map集合的形式返回多个数据对象
     */
    @Override
    public List<Map<String, Object>> selectMaps(Wrapper<DO> queryWrapper) {
        return super.baseMapper.selectMaps(queryWrapper);
    }

    /**
     * 根据动态构建的where条件批量查询多条数据库记录
     *
     * @param queryWrapper 动态构建where条件的对象
     * @return 返回多个Object类型的数据对象
     */
    @Override
    public List<Object> selectObjs(Wrapper<DO> queryWrapper) {
        return super.baseMapper.selectObjs(queryWrapper);
    }

    /**
     * 根据动态构建的where条件分页查询多条数据库记录
     *
     * @param page         分页对象
     * @param queryWrapper 动态构建where条件的对象
     * @param <E>          声明数据对象的引用类型
     * @return 分页返回数据对象集合
     */
    @Override
    public <E extends IPage<DO>> E selectPage(E page, Wrapper<DO> queryWrapper) {
        return super.baseMapper.selectPage(page, queryWrapper);
    }

    /**
     * 根据动态构建的where条件分页查询多条数据库记录
     *
     * @param page         分页对象
     * @param queryWrapper 动态构建where条件的对象
     * @param <E>          声明数据对象的引用类型
     * @return 以Map集合的形式分页返回数据对象集合
     */
    @Override
    public <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, Wrapper<DO> queryWrapper) {
        return super.baseMapper.selectMapsPage(page, queryWrapper);
    }
    // endregion

}
